% -*- program: xelatex -*-
\documentclass[12pt]{beamer} 
%\usepackage{beamerthemesplit}

\usepackage{fontspec}
\setsansfont{PT Sans}
\setmonofont{PT Mono}

\usepackage{beamerthemesplit}
\usefonttheme[onlymath]{serif}

\usetheme{CambridgeUS}
\usecolortheme{lily}
  
\hypersetup{unicode=true}
\DeclareFontEncoding{T1}
\fontencoding{T1}
\usepackage[russian]{babel}

\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphics,graphicx}
\usepackage{listings}
\usepackage{media9}
\usepackage{fancyvrb}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{verbatim,fancyvrb}
\usepackage{color,xcolor}
\usepackage{colortbl}
\usepackage{qrcode}

\newtheorem{ru_def}{Теорема}
\renewenvironment{theorem}{\begin{ru_def}}{\end{ru_def}}

\definecolor{mygreen}{RGB}{28,172,0} % color values Red, Green, Blue
\definecolor{mylilas}{RGB}{170,55,241}
\definecolor{codecolor}{RGB}{0,120,0}
\definecolor{light-gray}{gray}{0.95}
\definecolor{light-green}{RGB}{205,255,204}
\definecolor{light-red}{rgb}{0.9, 0.8, 0.8}
\definecolor{light-yellow}{rgb}{1,1,0.85}
\definecolor{light-blue}{RGB}{255,204,153}
\definecolor{dark-blue}{rgb}{0,0,0.6}
\definecolor{dark-red}{RGB}{204,0,0}
\definecolor{dark-green}{RGB}{28,172,0}

\usepackage{pifont}% http://ctan.org/pkg/pifont
\newcommand{\cmark}{\textcolor{green}{\ding{51}}}
\newcommand{\xmark}{\textcolor{red}{\ding{55}}}

\setbeamercolor{frametitle}{fg=dark-red,bg=gray!10}
\setbeamerfont{title}{series=\bfseries,parent=structure}
\setbeamerfont{frametitle}{series=\bfseries,parent=structure}
\setbeamertemplate{blocks}[rounded][shadow=false]
\setbeamercolor{block title}{fg=structure,bg=white}
\setbeamertemplate{navigation symbols}{}
 
\renewcommand{\emph}[1]{\textcolor{dark-blue}{#1}}
\newcommand{\emphb}[1]{\textcolor{dark-blue}{\textbf{#1}}}

\usepackage{tikz}
\usetikzlibrary{calc,patterns,decorations.pathmorphing,decorations.markings,positioning}
\usetikzlibrary{arrows,matrix,positioning,decorations,snakes}
\colorlet{myRed}{red!20}
\tikzset{
  rows/.style 2 args={/utils/temp/.style={row ##1/.append style={nodes={#2}}},
    /utils/temp/.list={#1}},
  columns/.style 2 args={/utils/temp/.style={column ##1/.append style={nodes={#2}}},
    /utils/temp/.list={#1}}}
\makeatletter
\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax,
  add font/.code=%
    \expandafter\def\expandafter\tikz@textfont\expandafter{\tikz@textfont#1},
  left delimiter/.style 2 args={append after command={\tikz@delimiter{south east}
    {south west}{every delimiter,every left delimiter,#2}{south}{north}{#1}{.}{\pgf@y}}}}
\makeatother

%\warn{\matcode}[1]{ \textcolor{codecolor}{\texttt{#1}}}
%\newcommand{\matcode}[1]{\begin{Verbatim}[formatcom=\color{red}]#1\end{Verbatim}}
\definecolor{codecolor}{RGB}{0,150,0}
\newcommand{\matcode}[1]{ \textcolor{codecolor}{\texttt{#1}}}

\newcommand{\imgsrc}[1]{ 
\begin{tikzpicture}[remember picture,overlay]
  \node[anchor=north, rotate=90, inner sep=0.5pt] at (current page.west) {\fontsize{5}{6}\selectfont \textcolor{light-gray}{#1}};
\end{tikzpicture}  
}


\title{Нормализованные формы}
\subtitle{Базы данных}
\author[Кафедра ММЭ]{Юдинцев В. В.}
\institute[Самарский университет]{Кафедра математических методов в экономике}

%\pgfdeclareimage[height=1cm]{logo}{ssau.pdf}
%\logo{\pgfuseimage{logo}}
%\setbeameroption{show notes}
%\graphicspath{{img/}}
 
\lstset{language=matlab, 
    keepspaces=true,
    extendedchars=true,
    basicstyle={\footnotesize  \color{black}},
    breaklines=true,
    morekeywords={matlab2tikz},
    keywordstyle=\color{blue},
    morekeywords=[2]{1}, keywordstyle=[2]{\color{codecolor}},
    identifierstyle={ \bf \color{black} },
    stringstyle=\color{mylilas},
    commentstyle=\color{mygreen},%
    showstringspaces=false,
    numbers=left,%
    numberstyle={\tiny \color{black}},
    numbersep=7pt, 
    emph=[1]{case,switch,otherwise},emphstyle=[1]\color{blue}, 
    frame=single,    
    %lineskip=-1.0pt,
    %emph=[2]{word1,word2}, emphstyle=[2]{style},    
}

\makeatother
\setbeamertemplate{footline}
{
  \leavevmode%
  \hbox{%  
  \begin{beamercolorbox}[wd=.3\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}%
    \usebeamerfont{author in head/foot}\insertshortauthor
  \end{beamercolorbox}%  
  \begin{beamercolorbox}[wd=.6\paperwidth,ht=2.25ex,dp=1ex,center]{title in head/foot}%
    \usebeamerfont{title in head/foot}\insertshorttitle
  \end{beamercolorbox}%
  \begin{beamercolorbox}[wd=.1\paperwidth,ht=2.25ex,dp=1ex,center]{date in head/foot}%
    \insertframenumber{} / \inserttotalframenumber\hspace*{1ex}
  \end{beamercolorbox}}%
  \vskip0pt%
}

\setbeamertemplate{headline}{}
%\setbeamertemplate{footline}{}

\AtBeginSection[]{
  \begin{frame}[plain]
  %\vfill  
  \begin{tikzpicture}
  \useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);  
  \fill[color=dark-red]   (-1cm, 3.9cm) rectangle(\the\paperwidth, 5.9cm);
  %\usebeamerfont{title}\insertsectionhead\par%
  %\node[text width=\the\paperwidth,align=center] at (current page.center) {\color{ExecusharesWhite}\Large\textbf{\insertsectionhead}};  
  \node[text width=\the\paperwidth,align=center] at (6cm,4.9cm) {\color{white}\Large\textbf{\insertsectionhead}};  
  \end{tikzpicture}
  \end{frame}
}

% 
% Документ
%
%
\begin{document}

{
\setbeamercolor{background canvas}{bg=white}
\usebackgroundtemplate{\includegraphics[width=\paperwidth,height=\paperheight]{back.png}}
\begin{frame}[plain]
    \maketitle
\end{frame}
}

\section[Содержание]{}

\frame{
    \frametitle{Содержание}
    \tableofcontents
}

\begin{frame}[fragile]
    \frametitle{Нормализация данных}
    \emphb{Нормализация} -- это процесс организации данных в базе данных, включающий создание таблиц и установление отношений между ними в соответствии с правилами, которые \emph{обеспечивают защиту данных и делают базу данных более гибкой, устраняя избыточность и несогласованные зависимости}.
    \imgsrc{https://docs.microsoft.com/ru-ru/office/troubleshoot/access/database-normalization-description}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Нормализация данных}
    \begin{itemize}
    \item \emph{Избыточность данных} приводит к непродуктивному расходованию свободного места на диске. 
    \item Например, если данные, хранящиеся в нескольких местах, потребуется изменить, в них придется внести одни и те же изменения во всех этих местах. Изменение адреса клиента гораздо легче реализовать, если в базе данных эти сведения хранятся только в таблице Customers и нигде больше.
    \end{itemize} 
    \imgsrc{https://docs.microsoft.com/ru-ru/office/troubleshoot/access/database-normalization-description}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Нормальные формы}
    \begin{itemize}
    \item Существует несколько правил нормализации баз данных. Каждое правило называется <<нормальной формой>>. 
    \item Если выполняется первое правило, говорят, что база данных представлена в <<первой нормальной форме>>.
    \item Если выполняются три первых правила, считается, что база данных представлена в <<третьей нормальной форме>>.     
    \end{itemize} 
    \imgsrc{https://docs.microsoft.com/ru-ru/office/troubleshoot/access/database-normalization-description}
\end{frame}

\begin{frame}
    \frametitle{Четыре нормальные формы}
    \begin{itemize}
        \item[1NF] Все поля в таблицах неделимы и не содержат повторяющихся групп;
        \item[2NF] Все неключевые поля в таблицах зависят от первичного ключа;
        \item[3NF] В таблицах отсутствуют избыточные неключевые поля;
        \item[4NF] В таблицах устранены многозначные зависимости.
    \end{itemize}

\end{frame}

\section{Первая нормальная форма}

\begin{frame}
    \frametitle{Первая нормальная форма}
    В столбце "характеристики" содержаться несколько значений. Атрибут "характеристики" не является простым. \alert{Таблица не находится в первой нормальной форме}.
    \begin{table}[htbp]
	\centering
	\caption{Автомобили}
	\begin{tabular}{ccc}
		\hline
		Автомобиль & Характеристики & Год \\ \hline
		Toyota & Дизель, МТ & 2021 \\
		Toyota & A & 2021 \\
        Toyota & A & 2021 \\
        Toyota & A & 2021 \\
		Subaru & A & 2021 \\ 
        Subaru & A & 2021 \\ \hline
	\end{tabular}
\end{table}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Первая нормальная форма (1NF)}
    Отношение находится в 1НФ, если все его атрибуты являются простыми, все используемые \emph{домены должны содержать только скалярные значения}.    
    \begin{center}
        \includegraphics[width=1\linewidth]{Реляционная модель-1NF.png}
    \end{center}
    В преобразованной к 1НФ таблице больше строк
\end{frame}

\section{Вторая нормальная форма}

\begin{frame}
    \frametitle{Вторая нормальная форма}
    \begin{itemize}
    \item Таблица находится во второй нормальной форме тогда и только тогда, когда она находится в первой нормальной форме и \emph{каждый неключевой атрибут неприводимо зависит от (каждого) её потенциального ключа}. 
    \item Для составного ключа в таблице не должно быть атрибутов, зависящих только от части первичного ключа.
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Пример: таблица домов}
    \begin{center}
        \includegraphics[width=0.65\linewidth]{Реляционная модель-2NF_BAD.png}
    \end{center}
    \begin{itemize}
        \item \emphb{Составной} первичный ключ таблицы: STREET\_ID, BUILD\_NO
        \item \alert{Имя улицы \emphb{NAME} зависит только от части ключа -- от STREET\_ID}
        \item Следствием этого является повторение данных (имени улицы) в таблице
        \item При необходимости переименовании одной улицы необходимо изменить несколько строк в этой таблице
    \end{itemize}
\end{frame}

 
\begin{frame}
    \frametitle{Пример. Преобразование к 2NF}
    \begin{itemize} 
        \item Исходная таблица разделяется на две: \emph{улицы} (справочник улиц) и \emph{дома}*
        \item Первичный ключ таблицы \emph{улицы} -- \emphb{STREET\_ID}
        \item Первичный ключ таблицы \emph{дома} -- \emphb{BUILD\_NO}
        \item Таблица \emph{дома} ссылается на таблицу \emph{улицы} -- внешний ключ \emphb{STREET\_ID}
    \end{itemize}    
    \begin{center}
        \includegraphics[width=0.9\linewidth]{Реляционная модель-2NF.png}
    \end{center}
    {\tiny *предполагаем, что номера домов уникальны}
\end{frame}


\begin{frame}
    \frametitle{Преимущества новой схемы}
    \begin{itemize} 
        \item Уменьшается избыточность данных 
        \item При переименовании улицы изменяется только одна строка справочника улиц -- таблицы \emph{улицы} 
    \end{itemize}    
    \begin{center}
        \includegraphics[width=0.9\linewidth]{Реляционная модель-2NF.png}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Пример 2}
    \begin{itemize} 
        \item Первичный ключ таблицы -- \emph{(СКЛАД, ДЕТАЛЬ)}
        \item \emph{ИНДЕКС} склада зависит только от СКЛАДА, но не зависит от ДЕТАЛИ
    \end{itemize}    
    \begin{center}
        \includegraphics[width=0.7\linewidth]{2NF.png}
    \end{center}    
    \imgsrc{\url{https://habr.com/ru/post/113260/}}
\end{frame}

\begin{frame}
    \frametitle{Пример 2. Преобразование к 2НФ}
    \begin{center}
        \includegraphics[width=1.0\linewidth]{2NF-2.png}
    \end{center}    
    \imgsrc{\url{https://habr.com/ru/post/113260/}}
\end{frame}

\section{Третья нормальная форма}

\begin{frame}
    \frametitle{Третья нормальная форма (3NF)}
    \begin{itemize}
        \item Отношение находится в 3НФ, когда находится во 2НФ и каждый не ключевой атрибут \emph{нетранзитивно} зависит от первичного ключа.
        \item \alert{Транзитивная зависимость} -- это когда неключевые столбцы зависят от значений других неключевых столбцов.
    \end{itemize}    
\end{frame}

\begin{frame}
    \frametitle{Пример: таблица станций метро}
    \begin{center}
        \includegraphics[width=0.9\linewidth]{Реляционная модель-3NF-BAD.png}
    \end{center}
    \begin{itemize}
        \item \emph{ID} это ключевой атрибут (уникальный номер станции)
        \item \emph{LINE\_NAME} (имя ветки) зависит от \emph{LINE\_ID} (идентификатор ветки)
        \item \emph{LINE\_NAME} зависит от главного ключа \emph{ID} \alert{транзитивно}, через атрибут \emph{LINE\_ID}
    \end{itemize}    
    \imgsrc{\url{https://github.com/codedokode/pasta/blob/master/db/normalization.md}}
\end{frame}

\begin{frame}
    \frametitle{Преобразование к 3NF}
    \begin{itemize}
        \item Исходная таблица разбивается на две: \emph{станции} и \emph{ветки}
        \item Каждый неключевой атрибут в таблицах зависит только от ключевого атрибута        
    \end{itemize}    
    \begin{center}
        \includegraphics[width=1\linewidth]{Реляционная модель-3NF-2.png}
    \end{center}
    \imgsrc{\url{https://github.com/codedokode/pasta/blob/master/db/normalization.md}}
\end{frame}

\begin{frame}
    \frametitle{Пример 2}
    \begin{center}
        \includegraphics[width=0.9\linewidth]{Реляционная модель-3NF-3.png}
    \end{center}
    \begin{itemize}
        \item Имя победителя определяется сочетанием (ключом) \emph{МЕСТО} и \emph{ГОД}
        \item \emph{ГОД РОЖДЕНИЯ} зависит от имени победителя, следовательно \emph{транзитивно} от ключа
    \end{itemize}    
    \imgsrc{\url{https://github.com/codedokode/pasta/blob/master/db/normalization.md}}
\end{frame}


\begin{frame}
    \frametitle{Пример 2. Приведение к 3NF}
    \begin{itemize}
        \item Исходная таблица разбивается на таблицу \emph{состязаний} и таблицу (справочник) \emph{спортсменов}
        \item В таблице \emph{состязаний} указывается только ссылка на строку справочника \emph{спортсменов}, где представлена более полная информация о \emph{спортсмене}-победителе. 
        \item Атрибуты в таблице \emph{состязаний} зависят только от главного ключа 
    \end{itemize}    
    \begin{center}
        \includegraphics[width=1\linewidth]{Реляционная модель-3NF-4.png}
    \end{center}
    \imgsrc{\url{https://github.com/codedokode/pasta/blob/master/db/normalization.md}}
\end{frame}

\section{Нормальная форма Бойса-Кодда}

\begin{frame}
    \frametitle{Нормальная форма Бойса-Кодда}
    Переменная отношения находится в нормальной форме Бойса-Кодда тогда и только тогда, когда детерминанты всех её функциональных зависимостей являются потенциальными ключами.
\end{frame}

\begin{frame}
    \frametitle{Нормальная форма Бойса-Кодда}
    \begin{table}[h]
        \centering
        \begin{tabular}{|c|c|c|}
            \hline
            \cellcolor{red!20}СТУДЕНТ & \cellcolor{red!10} ДИСЦИПЛИНА & \cellcolor{gray!20} ЛЕКТОР \\\hline
            Рыжиков                      & Физика                  & Иванов                      \\\hline
            Светлова                     & Химия               & Петров                  \\\hline
            Светлова                     & Информатика          & Сергеев                 \\\hline
            Громов                       & Химия                   & Петров                  \\\hline
        \end{tabular}
    \end{table}
    \begin{itemize}
        \item (СТУДЕНТ, ДИСЦИПЛИНА) -- составной главный ключ
        \item (СТУДЕНТ, ДИСЦИПЛИНА) $\rightarrow$ (ЛЕКТОР)
        \item \alert{(ЛЕКТОР) $\rightarrow$ (ДИСЦИПЛИНА)}
        \item \emph{ЛЕКТОР} читает определенную \emph{ДИСЦИПЛИНУ} (пусть только одну), т.е. является детерминантом для атрибута \emph{ДИСЦИПЛИНА}, но атрибут \emph{ЛЕКТОР} не является потенциальным ключом в этой таблице
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Нормальная форма Бойса-Кодда}
    Исходная таблица разбивается на две таблицы: таблица \emph{студент-лектор}
    \begin{table}[h]
        \centering
        \begin{tabular}{|c|c|} 
            \hline
            \cellcolor{red!20}СТУДЕНТ & \cellcolor{gray!20} ЛЕКТОР \\\hline
            Рыжиков                      & Иванов                     \\\hline
            Светлова                      & Петров                     \\\hline
            Светлова                      & Сергеев                     \\\hline
            Громов                        & Петров                     \\\hline
        \end{tabular}
    \end{table}
    и таблицу \emph{лектор-дисциплина}
    \begin{table}[h]
        \centering
        \begin{tabular}{|c|c|}
            \hline
            \cellcolor{red!20}ЛЕКТОР & \cellcolor{red!10} ДИСЦИПЛИНА \\\hline
            Иванов                        & Физика                     \\\hline
            Петров                        & Химия                     \\\hline
            Сергеев                      & Информатика                    \\\hline
        \end{tabular}
    \end{table}
\end{frame}

\section{Четвёртая нормальная форма}

\begin{frame}
    \frametitle{Четвёртая нормальная форма (4NF)}
    \begin{itemize}
        \item Таблица приведена к четвертой нормальной форме, если она соответствует 3NF и в ней \emphb{отсутствуют многозначные зависимости} (многие ко многим).
        \item Независимые повторяющиеся группы данных не следует размещать в одном и том же отношении.
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Четвёртая нормальная форма (4NF)}
    \begin{center}
        \includegraphics[width=0.7\linewidth]{Реляционная модель-4NF-bad.png}
    \end{center}
    \begin{itemize}
        \item Зависимости: \emph{Филиал} $\rightarrow$ \emph{Пицца} и \emph{Филиал} $\rightarrow$ \emph{Район}
        \item Зависимости между \emph{Пицца} и \emph{Район} нет
        \item В таблице есть \emph{повторяющеся независимые группы}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Четвёртая нормальная форма (4NF)}
    Для того, чтобы исходное отношение (таблица) удовлетворяла 4NF, её необходимо разбить на два отношения \emph{Филиал-Пицца} и \emph{Филиал-Район}
    \begin{center}
        \includegraphics[width=0.9\linewidth]{Реляционная модель-4NF-good.png}
    \end{center}
\end{frame}     




\frame[plain]{
    \frametitle{Список использованных источников}
    \small
    \begin{itemize}
        \item Осипов Д. Л. Технологии проектирования баз данных. -- М.: ДМК Пресс, 2019.
        \item Нормализация отношений. Шесть нормальных форм \\
              {\scriptsize \url{https://habr.com/ru/post/254773/}}
        \item Fourth Normal Form (4NF) \\
              {\scriptsize \url{https://www.studytonight.com/dbms/fourth-normal-form.php}}
        \item Introduction of 4th and 5th Normal form in DBMS \\
              {\scriptsize \url{https://www.geeksforgeeks.org/introduction-of-4th-and-5th-normal-form-in-dbms/}}
    \end{itemize}
}

\frame[plain,c]{
    \begin{center}
        \qrcode[height=1in]{https://classmech.ru/pages/databases/main}\\
        \vspace{2mm}
        {\tiny \url{https://classmech.ru/pages/databases/main} }
    \end{center}
}

\end{document}